
/**
 * Cette classe est la principale classe � modifier. Elle contient les algorithmes de r�solution
 * ou cr�e les objets permettant de lancer ces algorithmes. 
 * 
 *  La principale m�thode � compl�ter / impl�menter dans cette classe est la m�thode solve().
 *  
 *  Un objet <code>TSPSolver</code> est cr�� par la classe principale qui cr�e �galement:
 *  	<li><code>m_instance</code> l'objet <code>Instance</code> qui contient les donn�es du probl�me.
 *  	<li><code>m_solution</code> l'objet <code>Solution</code> � modifier qui contient la solution qui sera �valu�e et retourn�e par le programme.
 *  	<li><code>m_time</code> le temps maximum allou� au programme.
 *  <br><br>
 *  La classe principale appelle ensuite la m�thode <code>solve()</code>. 
 * 
 * @author Damien Prot, Fabien Lehu�d� 2012
 * 
 */
public class TSPSolver {

  // --------------------------------------------
  // --------------- ATTRIBUTS ------------------
  // --------------------------------------------

  /** Stocke la solution du probl�me */
	private Solution m_solution;

  /** Donnn�es du probl�me de TSP */
	private Instance m_instance;

  /** Temps allou� � la r�solution du probl�me */
	private long m_time;

	
  // --------------------------------------------
  // --------------- ACCESSEURS -----------------
  // --------------------------------------------

  // Pour acc�der aux attributs de la classe TSPSolver

  /** @return la solution du probl�me */
	public Solution getSolution() {
		return m_solution;
	}

  /** @return Donnn�es du probl�me de TSP */
	public Instance getInstance() {
		return m_instance;
	}

  /** @return Temps allou� � la r�solution du probl�me */
	public long getTime() {
		return m_time;
	}

  /**
   * Fixe la solution du probl�me
   * 
   * @param m_solution
   *          : la solution du probl�me
   */
	public void setSolution(Solution m_solution) {
		this.m_solution = m_solution;
	}

  /**
   * Fixe l'instance du probl�me
   * 
   * @param m_instance
   *          : l'instance du probl�me
   */
	public void setInstance(Instance m_instance) {
		this.m_instance = m_instance;
	}

  /**
   * Fixe le temps allou� � la r�solution du probl�me
   * 
   * @param time
   *          : temps allou� � la r�solution du probl�me
   */
	public void setTime(long time) {
		this.m_time = time;
	}

	
  // --------------------------------------
  // -------------- METHODES --------------
  // --------------------------------------
	
  /**
   * TODO M�thode � modifier pour la r�solution du probl�me.
   * 
   * Attention � ne pas �crire de message sur la sortie standard (pas de
   * <code>System.out.print/println</code>). Vous pouvez utilisez la sortie
   * d'erreur (<code>System.err.print/println</code>).
   * 
   * Plus pr�cis�ment il faut renseigner la solution <code>m_solution</code>
   * pour cr�er la meilleure solution possible. Se r�f�rer � la documentation de
   * la classe <code>Solution</code> pour la m�thode et le codage de la
   * solution. Attention, il faut v�rifier que le temps �coul� est inf�rieur �
   * la limite <code>m_time<\code>.
   * 
   * @throws Exception
   *           Retourne des exception notamment en cas d'erreur sur les num�ros de sommets. 
   */
	public void solve() throws Exception {
		AntColony colonie = new AntColony(this.getInstance(),25,3000, m_time);
		colonie.start();
		this.setSolution(colonie.getMeilleurChemin());
		this.m_solution.validate();
		System.err.println(this.m_solution.getError());
	}



}
